package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.bean.*;
import com.itheima.dto.DishDto;
import com.itheima.exception.MyException;
import com.itheima.mapper.CategoryMapper;
import com.itheima.mapper.DishMapper;
import com.itheima.service.DishFlavorService;
import com.itheima.service.DishService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author hebing
 * @version 1.0
 */
@Service
@Transactional
public class DishServiceImpl implements DishService {
    @Autowired
    private DishMapper dm;

    @Autowired
    private DishFlavorService dfs;

    @Autowired
    private CategoryMapper cm;

    /**
     * 添加菜品
     *
     * @param dishDto
     * @return
     */
    @Override
    public void addDish(DishDto dishDto) {
        //在这里需要添加部分数据到dish表 保存菜品信息
        int rows = dm.insert(dishDto);
        //做判断 保存了菜品再保存口味
        if (rows > 0) {
            //保存完毕需要获取菜品的id
            Long dishId = dishDto.getId();
            //获取菜品口味列表
            List<DishFlavor> flavors = dishDto.getFlavors();
            //判断口味列表是否为空
            if (flavors != null) {
                //遍历口味列表
                flavors = flavors.stream().map((flavor) -> {
                    flavor.setDishId(dishId);
                    return flavor;
                }).collect(Collectors.toList());
                //保存菜品口味数据到菜品口味列表dish_flavor
                dfs.addDishFlavor(flavors);
            }
        }
    }

    /**
     * 分页查询
     *
     * @param params
     * @return
     */
    @Override
    public IPage<DishDto> findPage(PageParams params) {
        //构造分页器构造器对象
        IPage<DishDto> dtoIPage = new Page<>();
        IPage<Dish> iPage = new Page<>(params.getPage(), params.getPageSize());
        //条件构造器
        LambdaQueryWrapper<Dish> lqw = new LambdaQueryWrapper<>();
        //添加过滤条件
        lqw.like(params.getName() != null, Dish::getName, params.getName());
        //添加排序条件 根据修改时间进行升序排序
        lqw.orderByAsc(Dish::getUpdateTime);
        //执行查询
        dm.selectPage(iPage, lqw);
        //对象拷贝
        BeanUtils.copyProperties(iPage, dtoIPage, "records");
        //dish菜品的总数据
        List<Dish> records = iPage.getRecords();
        //使用流传送资源
        List<DishDto> list = records.stream().map((item) -> {
            //创建DishDto对象
            DishDto dishDto = new DishDto();
            //拷贝
            BeanUtils.copyProperties(item, dishDto);
            //获取分类菜品id
            Long categoryId = item.getCategoryId();
            //根据id查询分类对象
            Category category = cm.selectById(categoryId);
            if (category != null) {
                dishDto.setCategoryName(category.getName());
            }
            //根据dishId查询菜品口味表 获取口味数据
            Long dishId = item.getId();
            //调用dishFlavorService查询数据库
            List<DishFlavor> flavorList = dfs.selectFlavors(dishId);
            if (flavorList != null) {
                //赋值
                dishDto.setFlavors(flavorList);
            }
            return dishDto;
        }).collect(Collectors.toList());
        //将list封装到dto对象中
        dtoIPage.setRecords(list);
        //返回对象
        return dtoIPage;
    }

    /**
     * 查询dish中查询数据库是否存在该id
     *
     * @param id
     * @return
     */
    @Override
    public int selectCount(Long id) {
        //构建查询条件对象
        LambdaQueryWrapper<Dish> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Dish::getCategoryId, id);
        //调用dao查询数据库是否存在该id的值
        return dm.selectCount(lqw);
    }

    /**
     * 修改数据
     *
     * @param dishDto
     * @return
     */
    @Override
    public int update(DishDto dishDto) {
        //这里需要修改两个地方
        LambdaQueryWrapper<Dish> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Dish::getId, dishDto.getId());
        //修改dish表数据
        int rows = dm.update(dishDto, lqw);
        //修改dishFlavor表数据
        List<DishFlavor> flavorList = dishDto.getFlavors();
        //判断集合不为空 并且集合的长度不为0
        if (flavorList != null && flavorList.size() != 0) {
            //先删除再更新
            dfs.delete(flavorList);
            int rows2 = dfs.update(flavorList);
            return rows2;
        }
        return rows;
    }

    /**
     * 根据categoryId查询都有哪些菜
     *
     * @param categoryId
     * @return
     */
    @Override
    public List<DishDto> getDish(Long categoryId) {
        //构建查询条件对象
        LambdaQueryWrapper<Dish> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Dish::getCategoryId, categoryId);
        //调用dao查询都有哪些菜品
        List<Dish> dishList = dm.selectList(lqw);
        //拷贝
        List<DishDto> dishDtoList = dishList.stream().map(dish -> {
            //创建dishDto对象
            DishDto dishDto = new DishDto();
            //拷贝
            BeanUtils.copyProperties(dish, dishDto);
            //查询口味数据
            List<DishFlavor> dishFlavorList = dfs.selectFlavors(dish.getId());
            //设置口味数据
            dishDto.setFlavors(dishFlavorList);
            //返回 收集到新的集合
            return dishDto;
        }).collect(Collectors.toList());
        //返回需要的对象
        return dishDtoList;
    }

    /**
     * 根据ids进行删除
     *
     * @param ids
     * @return
     */
    @Override
    public int deleteByIds(Long[] ids) {
        //根据ids查询数据库售卖状态 如果存在起售的直接抛出异常不能删除
        List<Dish> dishList = dm.selectBatchIds(Arrays.asList(ids));
        //做非空判断
        if (dishList != null && dishList.size() != 0) {
            //遍历
            for (Dish dish : dishList) {
                if (dish.getStatus() == 1) {
                    throw new MyException("存在起售状态的菜品无法删除");
                } else {
                    int rows = dm.deleteById(dish.getId());
                    return rows;
                }
            }
        }
        //为空 就返回0
        return 0;
    }

    /**
     * 批量操作起售
     *
     * @param ids
     * @return
     */
    @Override
    public int updateStatusToOn(List<Long> ids) {
        //根据ids查询数据库
        List<Dish> dishList = dm.selectBatchIds(ids);
        //判断并遍历
        if (dishList != null && dishList.size() > 0) {
            for (Dish dish : dishList) {
                //修改状态
                dish.setStatus(1);
                //修改表 这里不能返回 需要全部修改完成
                dm.updateById(dish);
            }
            //遍历完了返回
            return 1;
        }
        //长度为0
        return 0;
    }

    /**
     * 批量操作停售
     *
     * @param ids
     * @return
     */
    @Override
    public int updateStatusToOff(List<Long> ids) {
        //根据ids查询数据库
        List<Dish> dishList = dm.selectBatchIds(ids);
        //判断并遍历
        if (dishList != null && dishList.size() > 0) {
            for (Dish dish : dishList) {
                //修改状态
                dish.setStatus(0);
                //修改表
                dm.updateById(dish);
            }
            //遍历完了再返回
            return 1;
        }
        //长度为0
        return 0;
    }


}
